package hello;

/**
 * Created with IntelliJIDEA.
 * Description:
 * User: ASUS
 * Date: 2025/9/11
 * Time: 15:09
 */
/**
 * 1. 使用 abstract 关键字定义一个抽象类 Shape
 * 这个类不能被 new Shape() 这样实例化
 */
abstract class Shape {
    // 抽象类可以包含普通的成员变量
    private String color;

    // 抽象类可以包含构造方法，主要用于子类创建对象时调用
    public Shape(String color) {
        // 初始化共有的属性
        this.color = color;
    }

    /**
     * 2. 使用 abstract 关键字定义一个抽象方法 calculateArea()
     * 它没有方法体，直接以分号结束。
     * 它强制所有继承 Shape 的子类都必须提供自己计算面积的具体实现。
     */
    public abstract double calculateArea();

    /**
     * 抽象类也可以包含普通（具体）的方法
     * 所有子类都会继承这个方法，无需重写
     */
    public String getColor() {
        // 返回颜色信息
        return this.color;
    }
}

/**
 * 定义一个具体的子类 Circle (圆形)，它继承自 Shape
 */
class Circle extends Shape {
    // 圆形特有的属性：半径
    private double radius;

    // Circle 的构造方法
    public Circle(String color, double radius) {
        // 第一行必须调用父类的构造方法来初始化父类部分
        super(color);
        // 初始化子类自己的属性
        this.radius = radius;
    }

    /**
     * 子类必须实现（重写）父类中所有的抽象方法
     * 这里提供了 Circle 计算面积的具体逻辑
     * @Override 注解会帮助编译器检查这是否是一个有效的重写
     */
    @Override
    public double calculateArea() {
        // 返回圆的面积
        return Math.PI * radius * radius;
    }
}

/**
 * 定义另一个具体的子类 Rectangle (矩形)
 */
class Rectangle extends Shape {
    // 矩形特有的属性：长和宽
    private double width;
    private double height;

    // Rectangle 的构造方法
    public Rectangle(String color, double width, double height) {
        // 调用父类构造方法
        super(color);
        // 初始化自己的属性
        this.width = width;
        this.height = height;
    }

    /**
     * Rectangle 类也必须实现 calculateArea 方法
     */
    @Override
    public double calculateArea() {
        // 返回矩形的面积
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        // 尝试实例化抽象类，这将导致编译错误
        // Shape s = new Shape("Red"); // Error: 'Shape' is abstract; cannot be instantiated

        // 我们可以创建具体子类的对象
        // 这里利用了多态，父类引用指向子类对象
        Shape circle = new Circle("红色", 5.0);
        Shape rectangle = new Rectangle("蓝色", 4.0, 6.0);

        // 调用方法
        System.out.println("圆形的颜色: " + circle.getColor());
        System.out.println("圆形的面积: " + circle.calculateArea());

        System.out.println("矩形的颜色: " + rectangle.getColor());
        System.out.println("矩形的面积: " + rectangle.calculateArea());
    }
}
//